USE business;
GO
-- jeli istnieje tabela Wyplaty...
IF OBJECT_ID('dbo.Wyplaty') IS NOT NULL
	DROP TABLE dbo.Wyplaty   -- ... to j usuwamy
GO
-- tworzymy tabel
CREATE TABLE dbo.Wyplaty
(
	ID_wyplaty    INT IDENTITY(1, 1) NOT NULL PRIMARY KEY,
	Id_pracownika INT NOT NULL,
	Imie          VARCHAR(50) NOT NULL,
	Nazwisko      VARCHAR(50) NOT NULL,
	Pensja        MONEY    NOT NULL,
	Data		  DATETIME NOT NULL,
	Id_dzialu     INT      NOT NULL,
	CONSTRAINT W_ID_dzialu_FK FOREIGN KEY(Id_dzialu)
	REFERENCES dbo.Dzialy (Id_dzialu)
)
-- i wypeniamy j przykadowymi danymi
INSERT INTO dbo.Wyplaty VALUES
(1, 'Robert', 'Abacki', 3000, '2006-01-01', 1);
INSERT INTO dbo.Wyplaty VALUES
(1, 'Robert', 'Abacki', 3200, '2006-02-01', 1);
INSERT INTO dbo.Wyplaty VALUES
(1, 'Robert', 'Abacki', 3400, '2007-01-01', 1);
INSERT INTO dbo.Wyplaty VALUES
(1, 'Robert', 'Abacki', 3800, '2007-02-01', 1);
INSERT INTO dbo.Wyplaty VALUES
(2, 'Marian', 'Babacki', 2500, '2006-01-01', 1);
INSERT INTO dbo.Wyplaty VALUES
(2, 'Marian', 'Babacki', 2500, '2006-02-01', 1);
INSERT INTO dbo.Wyplaty VALUES
(2, 'Marian', 'Babacki', 3200, '2007-01-01', 1);
INSERT INTO dbo.Wyplaty VALUES
(2, 'Marian', 'Babacki', 3800, '2007-02-01', 1);
INSERT INTO dbo.Wyplaty VALUES
(3, 'Adam', 'Cabacki', 3000, '2006-01-01', 1);
INSERT INTO dbo.Wyplaty VALUES
(3, 'Adam', 'Cabacki', 2800, '2006-02-01', 1);
INSERT INTO dbo.Wyplaty VALUES
(3, 'Adam', 'Cabacki', 3500, '2007-01-01', 1);
INSERT INTO dbo.Wyplaty VALUES
(3, 'Adam', 'Cabacki', 3500, '2007-02-01', 1);
GO


SELECT 
	Nazwisko,
	SUM(CASE WHEN a.Rok = '2006' THEN Pensja END) AS [2006],
	SUM(CASE WHEN a.Rok = '2007' THEN Pensja END) AS [2007]
FROM (SELECT Nazwisko, YEAR(Data) AS Rok, Pensja FROM dbo.Wyplaty) AS a
GROUP BY Nazwisko
GO


-- deklarowanie tabeli
DECLARE 
	@tab AS TABLE (naz VARCHAR(50) NOT NULL);

DECLARE
	@sql     NVARCHAR(500),  -- zmienna przechowujca zapytanie
	@pom     VARCHAR(50),    -- zmienna pomocnicza
	@kolumny NVARCHAR(300);  -- zmienna przechowujca kolumny zapytania

-- wstawienie do zmiennej @tab danych dotyczcych pracownikw  dane te posu do 
-- stworzenia listy kolumn w wyraeniu SELECT
INSERT INTO @tab 
SELECT DISTINCT Nazwisko FROM dbo.Wyplaty;

-- pobranie pierwszej wartoci ze zmiennej @tab
SET @pom = (SELECT MIN(naz) FROM @tab);
-- pocztek budowania listy kolumn
SET @kolumny = N'';
-- w ptli budowane jest odpowiednie wyraenie sumujce dane dla danego pracownika
WHILE @pom IS NOT NULL
BEGIN
	SET @kolumny = @kolumny + N', ' +
	N' SUM(CASE WHEN UPPER(Nazwisko) = UPPER(''' + @pom +
	''') THEN PENSJA END) AS ' + QUOTENAME(@pom) +
	NCHAR(13) + NCHAR(10);
	
  -- pobranie kolejnego pracownika ze zmiennej @tab
	SET @pom = (SELECT MIN(naz) FROM @tab WHERE naz > @pom)
END;

-- stworzenie zapytania
SET @sql = N'SELECT YEAR(Data) AS Rok ' + NCHAR(13) + NCHAR(10) + @kolumny +
	' FROM dbo.Wyplaty GROUP BY YEAR(Data) ORDER BY YEAR(Data)'

-- wywietlenie zapytania
PRINT @sql;

-- wykonanie zapytania
EXEC sp_executesql @sql
